#include <regx52.h>
/*修改代码：
两组交通信号灯，各增加一个行人按钮，按钮被按下后，
当前灯结束后，切换到绿灯状态，对向车道切换到红灯状态
*/
// 定义东西方向交通灯引脚
sbit EAST_RED = P2 ^ 0;    // 红灯控制引脚
sbit EAST_GREEN = P2 ^ 1;  // 绿灯控制引脚
sbit EAST_YELLOW = P2 ^ 2; // 黄灯控制引脚

// 定义南北方向交通灯引脚
sbit NORTH_RED = P2 ^ 3;    // 红灯控制引脚
sbit NORTH_GREEN = P2 ^ 4;  // 绿灯控制引脚
sbit NORTH_YELLOW = P2 ^ 5; // 黄灯控制引脚

// 定义按钮
sbit BTN1 = P3 ^ 1;
sbit BTN2 = P3 ^ 0;

//定义按钮状态,按钮开始都是未被按下的
bit BTN1_status = 0;  // 东西方向按钮按下标志
bit BTN2_status = 0; // 南北方向按钮按下标志

// 自定义延时函数（单位：ms）
void delay_ms(unsigned int ms)
{
    unsigned int i, j;
    for (i = 0; i < ms; i++)
    {
        for (j = 0; j < 123; j++)
            ; // 12MHz晶振下约1ms延时
    }
}

// 主函数
void main(void)
{
    unsigned char i;
    unsigned int count;
    
    // 初始化所有灯灭
    P2 = 0xFF;
    
    while (1)
    {
        // 阶段1：东西方向绿灯，南北方向红灯
        EAST_GREEN = 0;
        NORTH_RED = 0;
        
        // 检测行人按钮请求
        count = 0;
        while (count < 100)//不断检测
        {
            
            // 检测南北方向行人按钮
            if (BTN2 == 0)
            {
                delay_ms(20); // 消抖延时
                if (BTN2 == 0)
                {
                    while (BTN2 == 0); // 等待按钮释放
                    delay_ms(20);     // 释放消抖
                    BTN2_status = 1;
                }
            }
            
            delay_ms(50);
            count++;
            
            // 如果南北方向按钮被按下，结束当前阶段
            if (BTN2_status)
            {
                break;
            }
        }
        
        EAST_GREEN = 1; // 关闭东西绿灯
        
        // 黄灯闪烁
        for (i = 0; i < 3; i++)
        {
            EAST_YELLOW = 0;
            delay_ms(500);
            EAST_YELLOW = 1;
            delay_ms(500);
        }
        
        // 阶段2：东西方向红灯，南北方向绿灯
        EAST_RED = 0;
        NORTH_RED = 1;
        NORTH_GREEN = 0;
        
        // 重置南北方向按钮标志
        BTN2_status = 0;
        
        // 检测行人按钮请求
        count = 0;
        while (count < 100)
        {
            // 检测东西方向行人按钮
            if (BTN1 == 0)
            {
                delay_ms(20); // 消抖延时
                if (BTN1 == 0)
                {
                    while (BTN1 == 0); // 等待按钮释放
                    delay_ms(20);     // 释放消抖
                    BTN1_status = 1;
                }
            }
            
            delay_ms(50);
            count++;
            
            // 如果东西方向按钮被按下，结束当前阶段
            if (BTN1_status)
            {
                break;
            }
        }
        
        NORTH_GREEN = 1; // 关闭南北绿灯
        
        // 黄灯闪烁
        for (i = 0; i < 3; i++)
        {
            NORTH_YELLOW = 0;
            delay_ms(500);
            NORTH_YELLOW = 1;
            delay_ms(500);
        }
        
        // 阶段3：重置状态，准备下一个循环
        EAST_RED = 1;
        EAST_YELLOW = 1;
        NORTH_YELLOW = 1;
        
        // 重置东西方向按钮标志
        BTN1_status = 0;
    }
}
